// 执行命令  ts-node functionType.ts
// 函数
// 函数声明
function sum(x: number, y: number): number {
  return x + y;
}

// 函数表达式
let mySum: (x: number, y: number) => number = function (x: number, y: number): number {
  return x + y;
}

// 用接口定义函数类型
interface SearchFunc{
  (source: string, subString: string): boolean;
}
const SearchFunction: SearchFunc = (source, subString) => Boolean(source + subString)
// SearchFunction('1', '2')

// 可选参数
function buildName(firstName: string, lastName?: string) {
  if (lastName) {
      return firstName + ' ' + lastName;
  } else {
      return firstName;
  }
}
let tomcat = buildName('Tom', 'Cat');
let tom = buildName('Tom');

// 参数默认值
function buildName1(firstName: string, lastName: string = 'Cat') {
  return firstName + ' ' + lastName;
}
let tomcat1 = buildName1('Tom', 'Cat');
let tom1 = buildName1('Tom');

// 剩余参数
function push(array: any[], ...items: any[]) {
  items.forEach(function(item) {
      array.push(item);
  });
}
let a: any = [];
push(a, 1, true, '3');

// 函数重载或方法重载是使用相同名称和不同参数数量或类型创建多个方法的一种能力。 要解决前面遇到的问题，方法就是为同一个函数提供多个函数类型定义来进行函数重载，编译器会根据这个列表去处理函数的调用。
type Combinable = string | number;
function add(a:number,b:number):number;
function add(a: string, b: string): string;
function add(a: string, b: number): string;
function add(a: number, b: string): string;
function add(a: Combinable, b: Combinable) {
  if (typeof a === 'string' || typeof b === 'string') {
    return a.toString() + b.toString();
   }
   return a + b;
}
add(1, 2); // 3
add("1", "2"); //"12"
const result = add('Semlinker', ' Kakuqo');
result.split(' ');

 


console.log('function type: ', result.split(' '))